Release 10.1A: OpenEdge Development:
Programming Interfaces
UNIX named pipe examples
The following examples show different uses of named pipes. To provide a simple example of how named pipes operate, the first example shows how to use the shell to create a named pipe, send a message to it, and read the message back. The second example shows how to use named pipes with Progress.
Example 1 — creating and using a named pipe from the shell
In this example, the
catcommand sets up a message handler routine and theechocommand acts as the requestor:
To try this example, run the shell script,
i-pipex1.This script performs the following actions:
- The
mknodcommand creates a named pipe calledtrypipe.- The
catcommand openstrypipefor reading. It blocks becausetrypipehas not yet been opened for writing. Notice that an ampersand (&) is present at the end of thecatcommand; this runs thecatcommand as a background process.- The
echocommand openstrypipefor writing and writes a message. Thecatcommand, blocked until now, resumes execution, and the message appears on the display.- The
rmcommand deletestrypipe.Example 2 — using a named pipe with Progress
Before working with the following procedures, create a copy of the
demodatabase with the PRODB utility:
This example shows a simple user program that sends one line requests to a Progress message handler routine running in the background, and displays the results. The example consists of four files:
A display of these files follows:
To prepare and run the example, follow these steps:
The
i-pipex2script performs the following actions:
- It uses
mknodto create two named pipes:inpipeandoutpipe. Named pipeinpipecarries requests from the requestor to the message handler routine. Named pipeoutpipecarries results back in the opposite direction, from the message handler to the requestor.Figure 11–3 illustrates this process.
Figure 11–3: Named pipes and Progress
![]()
- It starts a background OpenEdge session that runs the message handler procedure,
i-pipex2.p, with the demo database. The following line ini-pipex2.popens the named pipeinpipefor input:
Notice that Progress accesses named pipes in exactly the same way as UNIX text files. At this point,
i-pipex2.pblocks until a requestor process opensinpipefor output.- After starting the Progress message handler, the script starts the requestor,
i-asksql, which opensinpipefor output using the following statements:
- As
i-asksqlopensinpipe,i-pipex2.punblocks and blocks again as it attempts to read a message frominpipe. The message handler procedure,i-pipex2.p, expects single-line requests from requestors, and can handle more than one requestor. This is the syntax for message handler requests:
Each request contains the name of the named (
output-named-pipe) pipe from which the requestor expects to receive results and an SQL statement (SQL-statement) surrounded by double quotes (" "). The message handler procedure reads these messages with the following statement:
Each requestor must specify a unique value for
output-pipe-name, or results might be intermixed. (Using the requestor’s PID number as part of the name ensures uniqueness. However, for that to work, the requestor probably has to create its own named pipe using themknod()system call.) Note that for this example, the requestor,i-asksql, uses the existing named pipeoutpipecreated by the script.- As the message handler waits for input, the requestor displays the following prompt:
You can enter a one-line SQL query like the following
SELECTfrom the demo database:
- The requestor constructs a message from the name of the output pipe (
outpipe, in the example) and the contents of your query, and writes the message toinpipe, as in the following statements fromi-asksql.c:
- As the message handler receives (and removes) the message from
inpipe, it unblocks and opens the output pipe named in the message with the following statement:
- The message handler blocks again, waiting for the requestor to open the same pipe for input (to receive the query result), as in the following statements from
i-asksql.c:
- The Progress message handler then continues to compile and run the SQL query using the following statement:
As the query generates output, Progress writes it one line at a time to the named pipe specified by
outpipe. The requestor reads each line as it is written to the output pipe, as in the following statements fromi-asksql. In the example, the requestor also writes each line to its standard output:
Note: If there is no output, you might have entered your SQL statement incorrectly. This causes
i-pipex2.pto terminate. To trap this type of error, write the SQL statement to a file instead of to a named pipe, then compile the file. If the compilation is successful, run it.Note that although the query procedure,
i-do-sql.p, contains only the single procedure parameter,{1}, you can extend it with formatting statements to avoid having to include these in each query, as in the following examples:
- The example requestor,
i-asksql, continues to prompt for queries, repeating Actions 5 through 9, until you press RETURN with no additional input.- After the requestor terminates, the
i-pipex2script terminates the Progress background process with the following commands:
The first command sends the Progress
QUITstatement to the message handler (instead of an SQL statement). The second command takes the place of Action 8, originally handled by the requestor. The requestor does not send theQUITto terminate the Progress background process so that multiple copies of the requestor — each with its own output pipe — can run without affecting the message handler. It is necessary because a process blocks until a named pipe it opens for writing is opened for reading (see the "Operational characteristics of named pipes" section). In this case, the message handler opens named pipeoutpipefor writing, and cannot executeQUITuntil thecatcommand opensoutpipefor reading.- The,
i-pipex2script uses thermcommand to remove the named pipes that it created.
|
Copyright © 2005 Progress Software Corporation www.progress.com Voice: (781) 280-4000 Fax: (781) 280-4095 |